require "import"
import "android.content.Intent"
import "android.content.IntentFilter"
-- ==========================================================
-- HÀM THUẬT TOÁN TÍNH LỊCH ÂM TỪ DƯƠNG LỊCH (Đơn giản hóa cho Lua)
-- ==========================================================
local function layLichAmVietNam(d, m, y)
  -- Đây là bảng dữ liệu nén lịch âm từ năm 2024 đến 2030 để tiết kiệm bộ nhớ cho mobile
  -- Cấu trúc: {Năm Dương Lịch, Ngày bắt đầu Tết Nguyên Đán (tháng dương), Số ngày các tháng âm}
  local lunarDatabase = {
    [2024] = {leap = 0, tet_thang = 2, tet_ngay = 10, b = {30,29,30,29,30,29,30,30,29,30,30,29}},
    [2025] = {leap = 6, tet_thang = 1, tet_ngay = 29, b = {29,30,29,30,29,30,29,30,30,29,30,29,30}}, -- Có tháng nhuận
    [2026] = {leap = 0, tet_thang = 2, tet_ngay = 17, b = {30,29,29,30,29,30,29,30,29,30,30,30}},
    [2027] = {leap = 0, tet_thang = 2, tet_ngay = 6,  b = {29,30,29,29,30,29,30,29,30,30,30,29}},
    [2028] = {leap = 5, tet_thang = 1, tet_ngay = 26, b = {30,29,30,29,29,30,29,30,29,30,30,29,30}},
    [2029] = {leap = 0, tet_thang = 2, tet_ngay = 13, b = {30,29,30,29,29,30,29,29,30,30,29,30}},
    [2030] = {leap = 0, tet_thang = 2, tet_ngay = 3,  b = {30,30,29,30,29,29,30,29,29,30,29,30}}
  }

  local info = lunarDatabase[y]
  if not info then return "chưa cập nhật năm này" end

  -- Tính số ngày chênh lệch từ ngày 1/1 dương lịch của năm đó
  local function tinhNgayDuong(d, m, y)
    local mDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    if (y % 4 == 0 and y % 100 ~= 0) or (y % 400 == 0) then mDays[2] = 29 end
    local total = d
    for i = 1, m - 1 do total = total + mDays[i] end
    return total
  end

  -- Tính ngày Tết Nguyên Đán đổi ra ngày thứ bao nhiêu trong năm dương
  local ngayTetTrongNam = info.tet_ngay
  if info.tet_thang == 2 then ngayTetTrongNam = ngayTetTrongNam + 31 end

  local ngayHienTaiTrongNam = tinhNgayDuong(d, m, y)
  local diff = ngayHienTaiTrongNam - ngayTetTrongNam + 1

  -- Nếu trước tết thì tính theo năm cũ (Trường hợp này đơn giản hóa, lấy mặc định mùng 1 đầu năm cho gọn)
  if diff <= 0 then
    return "Cuối năm cũ"
  end

  -- Duyệt qua các tháng âm lịch để tìm ngày tháng chính xác
  local am_d = diff
  local am_m = 1
  local laNhuận = false

  for i = 1, #info.b do
    if am_d <= info.b[i] then
      break
    else
      am_d = am_d - info.b[i]
      if info.leap > 0 and i == info.leap then
        if not laNhuận then
          laNhuận = true
          -- Giữ nguyên am_m vì đây là tháng nhuận
        else
          laNhuận = false
          am_m = am_m + 1
        end
      else
        am_m = am_m + 1
      end
    end
  end

  local ten_ngay = am_d == 1 and "Mùng một" or ("Mùng " .. am_d)
  if am_d > 10 then ten_ngay = "Ngày " .. am_d end
  
  local chuoi_nhuan = laNhuận and " nhuận" or ""
  return string.format("%s tháng %d%s", ten_ngay, am_m, chuoi_nhuan)
end
-- ==========================================================

-- 1. Lấy thời gian hệ thống
local t = os.date("*t")
local H24, M, S = t.hour, t.min, t.sec
local d, m, y, w = t.day, t.month, t.year, t.wday

-- 2. Xác định buổi trong ngày
local chao = "đêm khuya"
if H24 >= 5 and H24 < 11 then chao = "sáng"
elseif H24 >= 11 and H24 < 13 then chao = "trưa"
elseif H24 >= 13 and H24 < 18 then chao = "chiều"
elseif H24 >= 18 and H24 < 22 then chao = "tối" end

-- 3. Gọi hàm lấy lịch âm (Đã được tối ưu hóa chạy offline hoàn toàn)
local am_lich = "Lịch âm " .. layLichAmVietNam(d, m, y) .. "."

-- 4. Lấy phần trăm pin
local b = this.registerReceiver(nil, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
local pin = 0
if b then
  pin = math.floor(b.getIntExtra("level", 0) * 100 / b.getIntExtra("scale", 100))
end

-- 5. Định dạng văn bản và phát âm thanh
local thu = ({"Chủ Nhật", "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy"})[w]
local H12 = H24 % 12 == 0 and 12 or H24 % 12

local msg = string.format(
  "Chào bạn buổi %s. Bây giờ là %d giờ %d phút %d giây. Hôm nay là %s, ngày %d tháng %d năm %d. %s Pin còn %d phần trăm.",
  chao, H12, M, S, thu, d, m, y, am_lich, pin
)

if service then service.speak(msg) else this.speak(msg) end
return true